#ifndef SOCKET_H_
#define SOCKET_H_
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <string>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include "../Constantes.h"
/*
 * @class Socket
 *
 * @brief Encapsulamiento del funcionamiento de un socket
 *
 */
class Socket {
protected:
	// File descriptor asociado
	int fd;
	// Estado del socket
	bool _valido;
	// Direccion a la que se conecta o por la que escucha conexiones
	sockaddr_in direccion;

	Socket(int fd);

	//Evito la copia
	Socket(const Socket& s);
	Socket* operator = (Socket* );

public:
	Socket();

	/**
	 * Se conecta al host y el puerto indicados
	 */
	int connect(const std::string& host, unsigned int port);

	/**
	 * Escucha conexiones por el puerto indicado.
	 * El maximo es nro_cliente
	 */
	int listen(unsigned int port, unsigned int nro_cliente);

	/**
	 * Cierra el socket.
	 */
	int close();


	/**
	 * Acepta una conexion y devuelve el socket creado
	 */
	int accept();

	/**
	 * Devuelve el estado del socket
	 */
	bool esValido();

	/**
	 * Realiza un shutdown del socket
	 */
	int shutdown();


	/**
	 * Envia el stream
	 */
	virtual int send(const std::string& stream)=0;

	/**
	 * Recibe en el stream
	 */
	virtual int receive(std::string& stream)=0;


	virtual ~Socket();
};

#endif /* SOCKET_H_ */
